package com.aboverock.module.system.service;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;

import com.baomidou.mybatisplus.extension.service.IService;
// import com.aboverock.datalake.exceptions.DatalakeDataParseException;
// import com.aboverock.datalake.exceptions.DatalakeRequestException;
import com.aboverock.module.system.domain.User;
import com.aboverock.module.system.utils.UserInfoUtil;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author Rock Wang
 * @since 2018-04-02
 */
public interface UserService extends IService<User> {

    /**
     * 检测系统是否支持本地用户功能.
     *
     * @return the string
     */
    public boolean isSupportLocalUser();

    /**
     * 本地数据库中根据登陆名精确查询未被删除的AD域帐号信息（含锁定）.
     *
     * @param loginName the login name
     * @return the user
     */
    public User getADUserByLoginName(String loginName);

    /**
     * 本地数据库中根据登陆名精确查询未被删除的本地帐号信息（含锁定）.
     *
     * @param loginName the login name
     * @return the user
     */
    public User getLocalUserByLoginName(String loginName);

    /**
     * 根据登陆名精确查询未被删除的User（含锁定）,并返回其对应角色、部门及体系.
     *
     * @param loginName the login name
     * @return the user
     */
    public User getByLoginNameWithRoles(String loginName);

    /**
     * 获取当前登陆用户及其角色.
     *
     * @return the current user
     */
    public User getCurrentUserWithRoles();

    /**
     * 查询所有用户及其角色.
     *
     * @return the list
     */
    public List<User> getUsersWithRoles();

    /**
     * 分页查询用户及其角色.
     *
     * @param start the start
     * @param pageSize the page size
     * @return the list
     */
    public List<User> getUsersWithRoles(Long start, Long pageSize);

    /**
     * 根据登陆名模糊查询未被删除的User（含锁定）.
     *
     * @param loginName the login name
     * @return the user
     */
    public List<User> fuzzyQueryByLoginName(String loginName);

    /**
     * 数据湖中员工信息存入本地数据库. <br>
     * 操作成功，返回员工信息列表; <br>
     * 操作失败，抛出SQLException;
     *
     * @param users the users
     * @return the list
     * @throws SQLException the SQL exception
     */
    public List<User> saveDataLakeEmpInfoToDb(List<User> users) throws SQLException;

    /**
     * 将数据湖中员工信息存入本地数据库. <br>
     * 操作成功，返回员工信息User;<br>
     * 操作失败，返回null;
     *
     * @param user the user
     * @return the user
     */
    public User saveDataLakeEmpInfoToDb(User user);

    /**
     * 从数据湖中同步本地数据库中用户信息.
     *
     * @throws DatalakeRequestException the datalake request exception
     * @throws DatalakeDataParseException the datalake data parse exception
     */
    // public void updateFromDatalake() throws DatalakeRequestException, DatalakeDataParseException;

    /**
     * Lock users by user id.
     *
     * @param userIds the user ids
     * @return true, if successful
     */
    public boolean lockUsersByUserId(List<String> userIds);

    /**
     * Unlock users by user id.
     *
     * @param userIds the user ids
     * @return true, if successful
     */
    public boolean unlockUsersByUserId(List<String> userIds);

    /**
     * 根据id删除用户，同时删除用户-角色映射表中数据.
     *
     * @param userIds the user ids
     * @throws SQLException the SQL exception
     */
    public void deleteByIds(List<String> userIds) throws SQLException;

    /**
     * 更新本地帐号的密码.
     *
     * @param user the user
     * @return true, if successful
     */
    public boolean updateLocalUserPassword(User user);

    /**
     * 根据id查询用户（不考虑逻辑删除状态）.
     *
     * @param id the id
     * @return the by id ignore logic delete
     */
    public User getByIdIgnoreLogicDelete(Serializable id);

    /**
     * 根据登陆名判断是否是超级管理员.<br>
     * 已过期，请使用 {@link UserInfoUtil#isSuperAdmin}
     *
     * @param user the user
     * @return true, if is super admin
     */
    @Deprecated
    public boolean isSuperAdmin(User user);

    /**
     * 检测是否是超级管理员名.<br>
     * 已过期，请使用 {@link UserInfoUtil#isSuperAdminName}
     *
     * @param name the name
     * @return true, if is super admin name
     */
    @Deprecated
    public boolean isSuperAdminName(String name);

}
